//1.promise是否兑现
// 兑现了：啥也不干
// 没有兑现：抛出异常，营造一个假象，取消了promise
// 2.通过额外声明一个类，类里面改写传入的resolve函数
class CancelPromise2{
    /**
     * 
     * @param {Function} excutor 
     * @param {Object} sighal 
     */
    constructor(excutor,signal=null){
        console.log(excutor);

        // 用于存储一个该写的resolve
        let _resolve = null;
        // 声明一个reject变量，存储promise的reject方法
        let _reject= null
        // 用于判断promise的状态是否兑现
        let isFulfilled = false;

        let promise = new Promise((resolve,reject)=>{
            _resolve = (value)=>{
                // console.log(value);
                isFulfilled = true;//promise状态已经兑现了
                resolve(value)
            }
            _reject = reject
            excutor(_resolve,reject)
        })
        // 判断是否传递了signal
        if(signal){
            //侦听AbortConstroller是否调用了abort()这个方法
            signal.addEventListener('abort',()=>{
                // 表示promise已经兑现了，没有必要中断了
                if(isFulfilled){
                    return
                }
                // 侦听到了，说明要取消promise
                _reject('cancelPromise2' + cancelPromise2.cancelMsg)
                new DOMException('cancelPromise2.cancelMsg','cancelPromise2')
            })
        }
        return promise
    }
    // 静态属性需要通过类直接调用
    static cancelMsg = 'promise已取消'
}
let fn =((resolve,reject)=>{
    setTimeout(() => {
        resolve({state:true,data:['成绩','合肥']})
    }, 2000);
})
let abortController = new AbortController();
let sighal = abortController.signal;
// 取消的方法
setTimeout(() => {
    abortController.abort()
}, 2000);
let p = new CancelPromise2(fn)
.then(res=>{
    console.log('then逻辑执行了');
    console.log(res);
})